//
//  HJUserAccountViewModel.swift
//  zhangmiSinweibo
//
//  Created by zhangmi on 16/5/24.
//  Copyright © 2016年 Paramount Pictures. All rights reserved.


//  用户账户的视图模型
/*
 1. 封装网络请求
 2. 存储用户数据
 3. 对外提供本地缓存的用户数据
 */


import UIKit

//设置偏好设置的key
private let userInfokey = "com.baidu.userInfoKey"

class HJUserAccountViewModel: NSObject {
    
    //单例对象, 伪单例
    static let sharedAccountViewModel: HJUserAccountViewModel = HJUserAccountViewModel()
    
    var userAccount: HJUserAccount?
    
    //重写构造方法, 在构造方法加载用户的账户模型
    //private 私有的构造方法
    private override init() {
        
        super.init()
        userAccount = loadUserAccount()
    }
    
    //通过 c判断用户是否登录的计算型数据,来解决每次需要判断的问题
    //计算型属性, 每次调用都会执行
    var userLogin: Bool {
        if userAccount?.expires_date?.compare(NSDate()) == .OrderedDescending{
            return true
            
        }
        
        //如果过期, 需要将 userAccount 设置为nil
        userAccount = nil
        return false
    }
    
    //增加一个用户头像地址 纯种NSURL地址
    //只读属性 特点:每次执行都会进行计算
    var headURL: NSURL? {
        get {
            return NSURL(string: userAccount?.avatar_large ?? "")
        }
    }
}

extension HJUserAccountViewModel {
    //使用code 加载用户授权的token(令牌)
    func loadAccessToken(code: String, finished: (isSuccess: Bool) -> () ) {
        
        HJNetworkTools.sharedTools.loadAccessToken(code) { (responseObject, error) in
            print(responseObject,error)
            //请求token成功之后 使用token 和 uid 获取用户信息
            if error != nil {
                finished(isSuccess: false)
                return
            }
            //请求成功
            self.loadUserInfo(responseObject, finished: finished)
        }
    }
    
    //请求用户信息
    private func loadUserInfo(response: AnyObject?, finished: (isSuccess: Bool) -> () ) {
        
        //尝试将AnyObject? 类型的response 转换为 字典类型 如果转换不成功 就返回失败
        guard let result = response as? [String : AnyObject] else {
            finished(isSuccess: false)
            return
        }
        
        HJNetworkTools.sharedTools.loadUserInfo(result) { (responseObject, error) in
            if error != nil {
                finished(isSuccess: false)
                return
            }
            
            //请求成功
            guard var dict = responseObject as? [String : AnyObject] else {
                finished(isSuccess: false)
                return
            }
            self.userAccount = HJUserAccount(dict: dict)
            
            //用户信息  就应该保存用户信息到本地
            //合并两个字典 统一保存用户数据到本地
            for (key, value) in result {
                dict[key] = value
            }
            
            //这段代码被移动到 分类中进行封装处理
            self.saveUserAccount(dict)
            //完成成功的回调
            finished(isSuccess: true)
        }
    }
}




//存储数据
extension HJUserAccountViewModel {
    //存储数据
    
    func saveUserAccount(dict: [String : AnyObject]) {
        //使用偏好设置保存字典数据
        
        
        //1.将dict转换为模型对象
        let user = HJUserAccount(dict: dict)
        
        //为了解决从未登录状态 -> 登录状态 userAccount 为nil的bug
        self.userAccount = user
        
        //2.将模型对象转换为字典
        let keys = ["access_token","expires_in","uid","name","avatar_large"]
        let userInfo = user.dictionaryWithValuesForKeys(keys)
        print(userInfo)
        //3.保存字典数据
        
        let userDefaults = NSUserDefaults.standardUserDefaults()
        //不能够向偏好设置里面添加nil
        userDefaults.setObject(userInfo, forKey: userInfokey)
        //同步
        userDefaults.synchronize()
        
        print(NSHomeDirectory())
        
        
    }
    //获取数据, 减少这个方法的调用, 希望只执行一次
    func loadUserAccount() -> HJUserAccount? {
        //如果使用 as! 在偏好设置并没有保存数据的时候 程序会崩溃
        //频繁读取磁盘中数据 磁盘IO 性能不高 并且影响磁盘的寿命
        
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfokey) as? [String : AnyObject] else {
            //防止没有存储数据的时候, 没有数据, 导致程序崩溃
            return nil
        }
        
        //字典转模型
        //再次判断用户的token值是否过期
        
        let user = HJUserAccount(dict: dict)
        
        return userAccount
    }
    
}






